package edu.csl.study.scala.basic



/**
 * 1、成员变量和成员方法 
 * 2、可以通过private或protected修饰成员变量和成员方法
 *    默认是public，但是不能加public
 * 3.类中可以有一个主构造器，在类上声明。
 *   辅助构造器：方法中的第一个动作必须调用本类其他构造器
 * 4.静态机制：不同java，不用static。而是通过单例对象类object实现静态机制
 * 5.如果object和class在同一个文件下而且名字一致，则object和class产生了伴生关系
 *   object是class的伴生对象 ，可以访问伴身类的私有属性 和 方法
 *   class是object的伴身类，可以访问伴身对象的私有属性 和 方法
 *
 * 6.scala的类支持重载和重写，同java
 * 7.scala的继承机制同java，通过extends关键字继承
 * 8.scala同java，都是单继承
 * 9.重写方法是普通方法，必须加override
 *   重写方法是抽象方法，不需加override
 * 10.scala支持抽象类机制：抽象类可以定义抽象方法和普通方法 - 同java
 * 11.scala的trait（特质）类似java中的接口
 * 12.scala 属于单继承、多混入（用with来混入特质）
 *    scala要求，不管是继承还是混入，必须有且仅有一个extends关键字.
 *    第一个用extends ，后面的都用with
 * 12.trait（特质）中除了可以定义抽象方法，还可以定义普通方法（这点不同于java接口）
 *    也并没有implement关键字
 * 13.scala导包可以放到任何地方
 * 14.scala序列化：extends或with Serializable
 *    序列化作用：（1）网络传输 （2）持久化
 */
class Person(v1:String = "无名",v2:Int = 99) {
  private var name = v1
  private var age = v2

  //--定义辅助构造器
  def this(v1:String){
    //方法中的第一个动作必须调用本类其他构造器
    this(v1,0)
    //可以访问伴身对象的私有属性
    println(Person.objName)
  }
  def this(v2:Int){
    //方法中的第一个动作必须调用本类其他构造器
    this("",v2)
  }
  def this(){
    //方法中的第一个动作必须调用本类其他构造器
    this("",0)
  }
  
  def sleep()={
    
    println("sleep")
    
  }
  def getName()={
    this.name
  }
  //无参方法可以简写 ： 可以胜利括号
  def getName2=this.name

  def setName(name:String)={
    this.name = name
  }
  def setAge(age:Int)={
    this.age = age
  }
  def getAge()={
    this.age
  }
  
}
/**
 * 
 * Person类的伴生对象
 * 
 * */
object Person{
  private val objName:String = "objName"
  //相当于java中的main方法
  def main(args: Array[String]) {
    val a1 = Array(1,2,3,4)
    a1.foreach(x=>println(x))
    a1.foreach(println)
    val p = new Person("222")
    //可以访问伴身类的私有属性
    println(p.name)
    //s开头字符串拼接，支持表达式
    println(s"名称：${p.name}")
  }
  
  def staticMethod()={
    
    println("staticMethod")
  }
  
}